package inmobiliaria.frsf.action;

import inmobiliaria.frsf.bo.ColeccionesComunesBO;
import inmobiliaria.frsf.bo.PropietarioBO;
import inmobiliaria.frsf.bo.impl.ColeccionesComunesBOImpl;
import inmobiliaria.frsf.bo.impl.PropietarioBOImpl;
import inmobiliaria.frsf.enums.TipoDocumentoEnum;
import inmobiliaria.frsf.model.Calle;
import inmobiliaria.frsf.model.Localidad;
import inmobiliaria.frsf.model.Propietario;
import inmobiliaria.frsf.model.Provincia;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Lucas
 * 
 */
public class PropietarioAction extends ActionSupport {

	/**
	 * Serial version ID
	 */
	private static final long serialVersionUID = 5766302492688390944L;

	private static final Integer ID_PROVINCIA_SANTA_FE = 20;
	private static final Integer ID_LOCALIDAD_SANTA_FE = 4;

	/**
	 * BO de propietario
	 */
	private PropietarioBO propietarioBO = new PropietarioBOImpl();

	/**
	 * BO de colecciones comunes
	 */
	private ColeccionesComunesBO coleccionesComunesBO = new ColeccionesComunesBOImpl();

	/**
	 * Entidad de propietario
	 */
	public Propietario propietario = new Propietario();

	/**
	 * Lista de propietarios
	 */
	public List<Propietario> propietarios = new ArrayList<Propietario>();

	/**
	 * Lista con tipos de documentos
	 */
	public List<TipoDocumentoEnum> tiposDocumentos = new ArrayList<TipoDocumentoEnum>();

	/**
	 * Lista con provincias
	 */
	public List<Provincia> provincias = new ArrayList<Provincia>();

	/**
	 * Lista con provincias
	 */
	public List<Localidad> localidades = new ArrayList<Localidad>();

	/**
	 * Lista con provincias
	 */
	public List<Calle> calles = new ArrayList<Calle>();

	/**
	 * Filtros grilla
	 */
	public String dni = "";
	public String nombre = "";
	public String apellido = "";

	public String nuevaLocalidad = "";
	public String nuevaCalle = "";

	public String cabecera;
	/**
	 * Constante para redirección.
	 */
	public static final String HOME = "home";
	public static final String ABRIR_ALTA = "alta";
	public static final String ABRIR_EDITAR = "edicion";
	public static final String GESTION_PROPIETARIO = "gestionPropietario";
	public static final String ERROR = "error";

	@Override
	public String execute() throws Exception {
		return HOME;
	}

	/**
	 * Se encarga de abrir la pantalla de alta de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String abrirAlta() {

		try {
			// Completo el combo de tipo de documentos
			this.tiposDocumentos = TipoDocumentoEnum.getList();
			this.provincias = coleccionesComunesBO.getProvincias();
			cabecera = "Alta Propietario";

			ServletActionContext.getRequest().getSession()
					.setAttribute("tiposDocumentos", this.tiposDocumentos);
			ServletActionContext.getRequest().getSession()
					.setAttribute("provincias", this.provincias);
			ServletActionContext.getRequest().getSession()
			.setAttribute("cabecera", cabecera);

			ServletActionContext.getRequest().getSession()
					.removeAttribute("localidad");
			ServletActionContext.getRequest().getSession()
					.removeAttribute("calle");

			this.propietario.getDomicilio().getCalle().getLocalidad()
					.getProvincia().setId(ID_PROVINCIA_SANTA_FE);
			this.propietario.getDomicilio().getCalle().getLocalidad()
					.setIdLocalidad(ID_LOCALIDAD_SANTA_FE);
			buscarLocalidades();
			buscarCalles();
			
			ServletActionContext.getRequest().getSession()
					.setAttribute("tipoGuardado", "alta");
			ServletActionContext.getRequest().setAttribute("tipoGuardado",
					"alta");

			return ABRIR_ALTA;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}

	}

	/**
	 * Se encarga de abrir la pantalla de modificación de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String editar() {

		try {

			cabecera = "Editar Propietario";

			String[] params = (String[]) ActionContext.getContext()
					.getParameters().get("id");

			Propietario propietario = propietarioBO
					.searchPropietarioById(Integer.parseInt(params[0]
							.toString()));
			propietario.setIdPersona(Integer.parseInt(params[0].toString()));
			this.propietario = propietario;

			// Completo el combo de tipo de documentos
			this.tiposDocumentos = TipoDocumentoEnum.getList();
			this.provincias = coleccionesComunesBO.getProvincias();

			ServletActionContext.getRequest().getSession()
					.setAttribute("tiposDocumentos", this.tiposDocumentos);
			ServletActionContext.getRequest().getSession()
					.setAttribute("provincias", this.provincias);
			ServletActionContext.getRequest().getSession()
			.setAttribute("cabecera", cabecera);

			ServletActionContext.getRequest().getSession()
					.removeAttribute("localidad");
			ServletActionContext.getRequest().getSession()
					.removeAttribute("calle");

			buscarLocalidades();
			buscarCalles();

			ServletActionContext.getRequest().getSession()
					.setAttribute("tipoGuardado", "editar");
			return ABRIR_ALTA;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}

	}

	/**
	 * Metodo que se encarga de determinar si se hace un alta o una
	 * modificacion.
	 */
	public String saveOrUpdate() {
		String tipoGuardado = (String) ServletActionContext.getRequest()
				.getSession().getAttribute("tipoGuardado");
		if (tipoGuardado.equals("alta")) {
			return guardar();
		} else {
			return guardarEdicion();
		}

	}

	/**
	 * Se encarga de abrir la pantalla de baja de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String eliminar() {
		try {

			String[] params = (String[]) ActionContext.getContext()
					.getParameters().get("id");

			propietarioBO.eliminar(Long.parseLong(params[0].toString()));
			return abrirGestionPropietario();

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}

	}

	/**
	 * Se encarga de guardar el alta de un propietario.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String guardarEdicion() {
		try {

			Localidad localidad = (Localidad) ServletActionContext
					.getRequest().getSession().getAttribute("localidad");
			if (propietario.getDomicilio().getCalle().getLocalidad()
					.getIdLocalidad() == -1) {
				propietario.getDomicilio().getCalle().getLocalidad()
						.setNombre(localidad.getNombre());
			}

			// Guardar Calle
			if (propietario.getDomicilio().getCalle().getId() == -1) {
				Calle calle = (Calle) ServletActionContext.getRequest()
						.getSession().getAttribute("calle");
				propietario.getDomicilio().getCalle()
						.setNombre(calle.getNombre());
			}

			propietarioBO.editar(propietario);
			ServletActionContext.getRequest().setAttribute("resultadoEdicion", "OK");
			return abrirGestionPropietario();

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Se encarga de guardar el alta/modificación/baja de un inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String guardar() {
		try {
			propietario.setFechaAlta(Calendar.getInstance());

			if (propietario.getDomicilio().getCalle().getLocalidad()
					.getIdLocalidad() == -1) {
				Localidad localidad = (Localidad) ServletActionContext
						.getRequest().getSession().getAttribute("localidad");
				propietario.getDomicilio().getCalle().getLocalidad()
						.setNombre(localidad.getNombre());
			}

			// Guardar Calle
			if (propietario.getDomicilio().getCalle().getId() == -1) {
				Calle calle = (Calle) ServletActionContext.getRequest()
						.getSession().getAttribute("calle");
				propietario.getDomicilio().getCalle()
						.setNombre(calle.getNombre());
			}

			propietarioBO.guardar(propietario);
			ServletActionContext.getRequest().setAttribute("resultado", "OK");
			return abrirGestionPropietario();
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Abre la pantalla de gestion de propietarios
	 * 
	 * @return
	 * @throws Exception
	 */
	public String abrirGestionPropietario() {
		try {
			List<Propietario> propietarios = propietarioBO.searchPropietario(
					null, null, null, null);
			this.propietarios = propietarios;

			ServletActionContext.getRequest().setAttribute("totalResults",
					propietarios.size());
			ServletActionContext.getRequest().setAttribute("pageSize", 5);

			return GESTION_PROPIETARIO;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Realiza el filtrado de la grilla de propietarios.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String filtrarGrilla() {
		try {
			List<Propietario> propietarios = propietarioBO.searchPropietario(
					null, nombre, apellido, dni);
			this.propietarios = propietarios;

			ServletActionContext.getRequest().setAttribute("totalResults",
					propietarios.size());
			ServletActionContext.getRequest().setAttribute("pageSize", 5);

			return GESTION_PROPIETARIO;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Actualiza el combobox de Localidades en la pantalla Alta.
	 * 
	 * @return
	 */
	public String actualizarLocalidadesAlta() {
		try {
			buscarLocalidades();
			buscarCalles();
			return ABRIR_ALTA;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Mentodo encargado de obtener las Localidades pertenecientes a una
	 * Provincia
	 * 
	 * @throws Exception
	 */
	private void buscarLocalidades() throws Exception {

		if (this.propietario.getDomicilio().getCalle().getLocalidad()
				.getProvincia().getId() != null) {
			this.localidades = coleccionesComunesBO.getLocalidades(Long
					.parseLong(this.propietario.getDomicilio().getCalle()
							.getLocalidad().getProvincia().getId().toString()));
		} else {
			this.localidades = coleccionesComunesBO.getLocalidades(Long
					.parseLong(ID_PROVINCIA_SANTA_FE.toString()));
		}

		Localidad localidad = (Localidad) ServletActionContext.getRequest()
				.getSession().getAttribute("localidad");
		if (localidad != null) {
			this.localidades.add(0, localidad);

		}
	}

	/**
	 * Agrega la localidad en el combo de localidades.
	 * 
	 * @return
	 */
	public String agregarLocalidadAlta() {
		try {
			Localidad localidad = new Localidad();
			localidad.setIdLocalidad(-1);
			localidad.setNombre(this.nuevaLocalidad);

			buscarLocalidades();

			this.localidades.add(0, localidad);
			this.propietario.getDomicilio().getCalle().getLocalidad()
					.setIdLocalidad(-1);

			ServletActionContext.getRequest().getSession()
					.setAttribute("localidad", localidad);

			return ABRIR_ALTA;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Agrega la calle en el combo de calles.
	 * 
	 * @return
	 */
	public String agregarCalleAlta() {
		try {
			Calle calle = new Calle();
			calle.setId(-1);
			calle.setNombre(this.nuevaCalle);
			buscarLocalidades();
			buscarCalles();
			this.calles.add(0, calle);
			this.propietario.getDomicilio().getCalle().setId(-1);

			ServletActionContext.getRequest().getSession()
					.setAttribute("calle", calle);

			return ABRIR_ALTA;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Actualiza el combobox de Localidades en la pantalla Alta.
	 * 
	 * @return
	 */
	public String actualizarCallesAlta() {
		try {
			buscarLocalidades();
			buscarCalles();
			return ABRIR_ALTA;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	public void buscarCalles() throws Exception {
		if (this.propietario.getDomicilio().getCalle().getLocalidad()
				.getIdLocalidad() != null
				&& localidades != null && !localidades.isEmpty()) {
			this.calles = coleccionesComunesBO.getCalles(this.propietario
					.getDomicilio().getCalle().getLocalidad().getIdLocalidad());
		} else {
			if (localidades != null && !localidades.isEmpty()
					&& localidades.get(0) != null) {
				this.calles = coleccionesComunesBO.getCalles(localidades.get(0)
						.getIdLocalidad());
			}
		}
	}

	/**
	 * @return the propietarioBO
	 */
	public PropietarioBO getPropietarioBO() {
		return propietarioBO;
	}

	/**
	 * @param propietarioBO
	 *            the propietarioBO to set
	 */
	public void setPropietarioBO(PropietarioBO propietarioBO) {
		this.propietarioBO = propietarioBO;
	}

	/**
	 * @return the tiposDocumentos
	 */
	public List<TipoDocumentoEnum> getTiposDocumentos() {
		return tiposDocumentos;
	}

	/**
	 * @param tiposDocumentos
	 *            the tiposDocumentos to set
	 */
	public void setTiposDocumentos(List<TipoDocumentoEnum> tiposDocumentos) {
		this.tiposDocumentos = tiposDocumentos;
	}

	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}

	/**
	 * @param dni
	 *            the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre
	 *            the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @return the propietario
	 */
	public Propietario getPropietario() {
		return propietario;
	}

	/**
	 * @param propietario
	 *            the propietario to set
	 */
	public void setPropietario(Propietario propietario) {
		this.propietario = propietario;
	}

	/**
	 * @return the propietarios
	 */
	public List<Propietario> getPropietarios() {
		return propietarios;
	}

	/**
	 * @param propietarios
	 *            the propietarios to set
	 */
	public void setPropietarios(List<Propietario> propietarios) {
		this.propietarios = propietarios;
	}

	/**
	 * @return the provincias
	 */
	public List<Provincia> getProvincias() {
		return provincias;
	}

	/**
	 * @param provincias
	 *            the provincias to set
	 */
	public void setProvincias(List<Provincia> provincias) {
		this.provincias = provincias;
	}

	/**
	 * @return the localidades
	 */
	public List<Localidad> getLocalidades() {
		return localidades;
	}

	/**
	 * @param localidades
	 *            the localidades to set
	 */
	public void setLocalidades(List<Localidad> localidades) {
		this.localidades = localidades;
	}

	/**
	 * @return the nuevaLocalidad
	 */
	public String getNuevaLocalidad() {
		return nuevaLocalidad;
	}

	/**
	 * @param nuevaLocalidad
	 *            the nuevaLocalidad to set
	 */
	public void setNuevaLocalidad(String nuevaLocalidad) {
		this.nuevaLocalidad = nuevaLocalidad;
	}

	/**
	 * @return the calles
	 */
	public List<Calle> getCalles() {
		return calles;
	}

	/**
	 * @param calles
	 *            the calles to set
	 */
	public void setCalles(List<Calle> calles) {
		this.calles = calles;
	}

	/**
	 * @return the apellido
	 */
	public String getApellido() {
		return apellido;
	}

	/**
	 * @param apellido
	 *            the apellido to set
	 */
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

}
